Naršykite pažangias elipsinių kreivių kriptografijos (ECC) operacijas, tokias kaip ECDH, viešojo rakto atkūrimas ir Šnoro parašai, naudojant „JavaScript“ natyvinį „BigInt“, kad pagerintumėte saugumą ir našumą.
„JavaScript BigInt“ elipsinių kreivių kriptografija: Išplėstinių operacijų gilus tyrimas
Amžiuje, kurį dominuoja skaitmeninė sąveika, nuo decentralizuotos finansų (DeFi) iki šifruoto pranešimų siuntimo nuo galo iki galo, mūsų kriptografinių pagrindų stiprumas niekada nebuvo kritiškesnis. Elipsinių kreivių kriptografija (ECC) yra šiuolaikinės viešojo rakto kriptografijos ramstis, siūlantis tvirtą saugumą su mažesniais rakto dydžiais, palyginti su jos pirmtakais, tokiais kaip RSA. Daugelį metų atlikti šias sudėtingas matematines operacijas tiesiogiai „JavaScript“ buvo iššūkis, dažnai reikalaujantis specializuotų bibliotekų, kurios atskyrė žemo lygio detales arba susidorojo su „JavaScript“ standartinio skaičiaus tipo apribojimais.
Natyvinio BigInt tipo „JavaScript“ (ES2020) įvedimas buvo revoliucinis momentas. Jis atlaisvino kūrėjus nuo 64 bitų slankiojo kablelio Number tipo apribojimų, suteikdamas mechanizmą, kaip tvarkyti bet kokio dydžio sveikuosius skaičius. Ši vienintelė funkcija atvėrė galimybes našiam, natyviniam ir skaidresniam kriptografiniam diegimui tiesiogiai „JavaScript“ aplinkose, tokiose kaip naršyklės ir „Node.js“.
Nors daugelis kūrėjų yra susipažinę su ECC pagrindais – raktų porų generavimu ir pranešimų pasirašymu – tikroji šios technologijos galia slypi jos pažangesnėse operacijose. Šis straipsnis pereina nuo pagrindų prie sudėtingų kriptografinių protokolų ir technikų, kurios dabar yra prieinamos dėka BigInt. Mes gilinsimės į elipsinių kreivių Difžio-Helmano (ECDH) saugiam raktų apsikeitimui, viešojo rakto atkūrimui iš parašų ir galingiems, agregavimui draugiškiems Šnoro parašams.
„BigInt“ revoliucija „JavaScript“ kriptografijoje
Prieš pasineriame į išplėstines operacijas, būtina suprasti, kodėl BigInt yra toks svarbus žaidimo keitiklis „JavaScript“ kriptografijai.
Number tipo problema
Tradicinis „JavaScript“ Number tipas yra IEEE 754 dvigubos tikslumo 64 bitų slankiojo kablelio skaičius. Šis formatas puikiai tinka plačiam pritaikymui, tačiau turi kritinį kriptografijos apribojimą: jis gali saugiai atstovauti tik sveikuosius skaičius iki Number.MAX_SAFE_INTEGER, kuris yra 253 - 1.
Kriptografiniai raktai ir tarpinės ECC reikšmės yra daug didesnės. Pavyzdžiui, populiari secp256k1 kreivė, naudojama „Bitcoin“ ir „Ethereum“, veikia ant pirminių skaičių lauko, kuris yra 256 bitų ilgio. Šie skaičiai yra keliais dydžio tvarkomis didesni nei tai, ką standartinis Number tipas gali tvarkyti neprarandant tikslumo. Bandymas atlikti skaičiavimus su tokiais skaičiais lemtų neteisingus ir nesaugius rezultatus.
Įveskite BigInt: savavališko tikslumo sveikieji skaičiai
BigInt elegantiškai sprendžia šią problemą. Tai atskiras skaitinis tipas, suteikiantis būdą atvaizduoti bet kokio dydžio sveikuosius skaičius. BigInt galite sukurti pridėdami `n` prie sveikojo skaičiaus literalio pabaigos arba iškviesdami BigInt() konstruktorių.
Pavyzdys:
const aLargeNumber = 9007199254740991n; // Saugus su BigInt
const anEvenLargerNumber = 115792089237316195423570985008687907853269984665640564039457584007908834671663n; // 256 bitų pirminis skaičius
Su BigInt visi standartiniai aritmetiniai operatoriai (+, -, *, /, %, **) veikia taip, kaip tikėtasi, šiems didžiuliams sveikiems skaičiams. Ši galimybė yra pagrindas, ant kurio statomi natyviniai „JavaScript“ ECC diegimai, leidžiantys tiesiogiai, tiksliai ir saugiai apskaičiuoti kriptografinius algoritmus, nepasikliaujant išoriniais „WebAssembly“ moduliais ar sudėtingomis kelių dalių skaičių bibliotekomis.
Elipsinių kreivių kriptografijos pagrindų apžvalga
Norint įvertinti pažangias operacijas, trumpai priminsime pagrindinius ECC koncepcijas.
Iš esmės ECC remiasi elipsinių kreivių algebraine struktūra baigtiniuose laukuose. Šios kreivės apibrėžiamos Vėjerštraso lygtimi:
y2 = x3 + ax + b (mod p)
Kur `a` ir `b` yra konstantos, apibrėžiančios kreivės formą, o `p` yra didelis pirminis skaičius, apibrėžiantis baigtinį lauką.
Pagrindinės sąvokos
- Kreivės taškas: Koordinačių pora (x, y), tenkinanti kreivės lygtį. Visos mūsų kriptografinės operacijos iš esmės yra „taškų aritmetika“.
- Bazinis taškas (G): Viešai žinomas, standartizuotas pradinio taško kreivėje.
- Privatusis raktas (d): Labai didelis, kriptografiškai saugus atsitiktinis sveikasis skaičius. Tai jūsų paslaptis.
BigIntkontekste `d` yra didelisBigInt. - Viešasis raktas (Q): Kreivės taškas, gautas iš privačiojo rakto ir bazinio taško atliekant operaciją, vadinamą skaliariniais daugyba: Q = d * G. Tai reiškia, kad taškas G pridedamas pats prie savęs `d` kartų.
ECC saugumas grindžiamas elipsinių kreivių diskrečiojo logaritmo problema (ECDLP). Lengva apskaičiuoti viešąjį raktą `Q`, turint privatųjį raktą `d` ir bazinį tašką `G`. Tačiau apskaičiuoti privatųjį raktą `d`, turint tik viešąjį raktą `Q` ir bazinį tašką `G`, yra neįmanoma.
Išplėstinė operacija 1: elipsinių kreivių Difžio-Helmano (ECDH) raktų apsikeitimas
Viena iš galingiausių ECC programų yra bendrojo slaptumo nustatymas tarp dviejų šalių per neužtikrintą komunikacijos kanalą. Tai pasiekiama naudojant elipsinių kreivių Difžio-Helmano (ECDH) raktų apsikeitimo protokolą.
Tikslas
Įsivaizduokite du asmenis, Alisą ir Bobą, kurie nori saugiai bendrauti. Jiems reikia sutarti dėl simetrinio šifravimo rakto, kurį žinotų tik jie, tačiau vienintelė jų komunikacijos priemonė yra viešas kanalas, kurį gali stebėti pasiklausytojas, Iva. ECDH leidžia jiems apskaičiuoti identišką bendrąjį slaptumą, niekada jo tiesiogiai neperduodant.
Protokolo žingsnis po žingsnio
- Raktų generavimas:
- Alisa sukuria savo privatųjį raktą, `d_A` (didžiulį atsitiktinį
BigInt), ir jos atitinkamą viešąjį raktą, `Q_A = d_A * G`. - Bobas sukuria savo privatųjį raktą, `d_B` (dar vieną didžiulį atsitiktinį
BigInt), ir jo viešąjį raktą, `Q_B = d_B * G`.
- Alisa sukuria savo privatųjį raktą, `d_A` (didžiulį atsitiktinį
- Viešųjų raktų apsikeitimas:
- Alisa siunčia savo viešąjį raktą, `Q_A`, Bobui.
- Bobas siunčia savo viešąjį raktą, `Q_B`, Alisai.
- Iva, pasiklausytojas, gali matyti tiek `Q_A`, tiek `Q_B`, bet negali išvesti privačių raktų `d_A` ar `d_B` dėl ECDLP.
- Bendrojo slaptumo skaičiavimas:
- Alisa paima Bobo viešąjį raktą `Q_B` ir dauginasi jį iš savo privataus rakto `d_A`, kad gautų tašką S: S = d_A * Q_B.
- Bobas paima Alisos viešąjį raktą `Q_A` ir dauginasi jį iš savo privataus rakto `d_B`, kad gautų tašką S: S = d_B * Q_A.
Komutatyvumo magija
Tiek Alisa, tiek Bobas pasiekia tą patį slaptą tašką `S` kreivėje. Taip yra todėl, kad skaliarinė daugyba yra asociatyvi ir komutatyvi:
Alisos skaičiavimas: S = d_A * Q_B = d_A * (d_B * G)
Babo skaičiavimas: S = d_B * Q_A = d_B * (d_A * G)
Kadangi d_A * d_B * G = d_B * d_A * G, abu jie apskaičiuoja tą patį rezultatą, niekada neatskleisdami savo privačių raktų.
Nuo bendrojo taško iki simetrinio rakto
Gautas bendrasis slaptumas `S` yra taškas kreivėje, o ne simetrinis raktas, tinkamas šifravimo algoritmams, tokiems kaip AES. Norint išvesti raktą, standartinė praktika yra paimti `S` taško x-koordinatę ir perduoti ją per rakto išvedimo funkciją (KDF), tokią kaip HKDF (HMAC pagrįsta rakto išvedimo funkcija). KDF naudoja bendrąjį slaptumą ir pasirinktinai druską bei kitą informaciją, ir generuoja kriptografiškai stiprų norimo ilgio raktą.
Visi pagrindiniai skaičiavimai – privačių raktų generavimas kaip atsitiktiniai BigInt ir skaliarinės daugybos atlikimas – labai priklauso nuo BigInt aritmetikos.
Išplėstinė operacija 2: viešojo rakto atkūrimas iš parašų
Daugelyje sistemų, ypač „blockchain“, efektyvumas ir duomenų minimalizavimas yra svarbiausi. Paprastai, norint patikrinti parašą, reikia pranešimo, paties parašo ir pasirašiusiojo viešojo rakto. Tačiau protinga elipsinių kreivių skaitmeninio parašo algoritmo (ECDSA) savybė leidžia atkurti viešąjį raktą tiesiogiai iš pranešimo ir parašo. Tai reiškia, kad viešojo rakto nereikia perduoti, taupant vertingą vietą.
Kaip tai veikia (aukšto lygio)
ECDSA parašą sudaro du komponentai (`r`, `s`).
- `r` yra išvestas iš atsitiktinio taško `k * G` x-koordinatės.
- `s` apskaičiuojamas remiantis pranešimo maišos (`z`), privačiuoju raktu (`d`) ir `r`. Formulė yra: `s = k_inverse * (z + r * d) mod n`, kur `n` yra kreivės tvarka.
Atliekant algebrinius parašo tikrinimo lygties manipuliacijas, galima išvesti viešojo rakto `Q` išraišką. Tačiau šis procesas duoda du galimus galiojančius viešuosius raktus. Norint išspręsti šią dviprasmybę, su parašu pateikiamas nedidelis papildomos informacijos gabalas, vadinamas atkūrimo ID (dažnai žymimas kaip `v` arba `recid`). Šis ID, paprastai 0, 1, 2 arba 3, nurodo, kuris iš galimų sprendimų yra teisingas ir ar rakto y-koordinatė yra lyginė, ar nelyginė.
Kodėl BigInt yra būtinas
Viešojo rakto atkūrimui reikalingos matematinės operacijos yra intensyvios ir apima modulinio atvirkštinio, daugybos ir 256 bitų skaičių sudėties operacijas. Pavyzdžiui, pagrindinis žingsnis apima `(r_inverse * (s*k - z)) * G` apskaičiavimą. Šios operacijos yra būtent tai, kam skirtas BigInt. Be jo, atliekant šiuos skaičiavimus natyviai „JavaScript“ būtų neįmanoma be reikšmingo tikslumo ir saugumo praradimo.
Praktinis pritaikymas: „Ethereum“ sandoriai
Ši technika garsiai naudojama „Ethereum“. Pasirašytame sandoryje siuntėjo viešasis adresas nėra tiesiogiai. Vietoj to, adresas (kuris yra išvestas iš viešojo rakto) atkuriamas iš parašo `v`, `r` ir `s` komponentų. Šis dizaino pasirinkimas sutaupo 20 baitų kiekviename sandoryje, o tai yra reikšmingas sutaupymas pasaulinio masto „blockchain“.
Išplėstinė operacija 3: Šnoro parašai ir agregacija
Nors ECDSA yra plačiai naudojamas, jis turi tam tikrų trūkumų, įskaitant parašo keičiamumą ir agregavimo savybių trūkumą. Šnoro parašai, dar viena ECC pagrįsta schema, suteikia elegantiškus sprendimus šioms problemoms ir daugelio kriptografų yra laikomi pranašesniais.
Pagrindiniai Šnoro parašų privalumai
- Įrodomas saugumas: Jie turi paprastesnį ir tvirtesnį saugumo įrodymą, palyginti su ECDSA.
- Ne-keičiamumas: Trečiasis asmuo negali pakeisti galiojančio parašo į kitą galiojantį parašą tam pačiam pranešimui ir raktui.
- Linijiškumas (Supergalia): Tai didžiausias privalumas. Šnoro parašai yra linijiniai, o tai leidžia naudoti galingas agregavimo technikas.
Parašo agregavimas paaiškintas
Linijiškumo savybė reiškia, kad kelis pasirašiusiųjų parašus galima sujungti į vieną, kompaktišką parašą. Tai yra žaidimo keitiklis kelių parašų (multisig) schemoms.
Apsvarstykite scenarijų, kai sandoriui reikia 3 iš 5 dalyvių parašų. Su ECDSA, jums reikėtų įtraukti visus tris individualius parašus į „blockchain“, užimant daug vietos.
Su Šnoro parašais procesas yra daug efektyvesnis:
- Rakto agregavimas: 3 dalyviai gali sujungti savo individualius viešuosius raktus (`Q1`, `Q2`, `Q3`), kad sukurtų vieną bendrą viešąjį raktą (`Q_agg`).
- Parašo agregavimas: Per bendradarbiavimo protokolą, pvz., MuSig2, dalyviai gali sukurti vieną bendrą parašą (`S_agg`), kuris yra galiojantis bendram viešajam raktui `Q_agg`.
Rezultatas – sandoris, kuris iš išorės atrodo identiškas standartiniam vieno pasirašiusiojo sandoriui. Jis turi vieną viešąjį raktą ir vieną parašą. Tai žymiai pagerina efektyvumą, mastelį ir privatumą, nes sudėtingos multisig sąrankos tampa neatskiriamos nuo paprastų.
BigInt vaidmuo
Agregavimo magija yra įsišaknijusi paprastoje elipsinių kreivių taškų sudėtyje ir skaliarinėje aritmetikoje. Bendro rakto kūrimas apima `Q_agg = Q1 + Q2 + Q3`, o bendro parašo kūrimas apima individualių parašo komponentų sudėjimą pagal kreivės tvarką. Visos šios operacijos, kurios sudaro tokių protokolų kaip MuSig2 pagrindą, atliekamos su dideliais sveikaisiais skaičiais ir kreivės koordinatėmis, todėl BigInt yra nepakeičiama priemonė Šnoro parašams ir agregavimo schemoms įgyvendinti „JavaScript“.
Įgyvendinimo svarstymai ir saugos geriausios praktikos
Nors BigInt leidžia mums suprasti ir įgyvendinti šias pažangias operacijas, gaminimo klasės kriptografijos kūrimas yra pavojingas uždavinys. Štai keletas kritinių svarstymų.
1. NEGALIMA savarankiškai kurti kriptografijos gamybai
Šis straipsnis skirtas mokyti ir iliustruoti pagrindinius mechanizmus. Jūs turėtumėte niekada diegti šiuos kriptografinius pirminius elementus nuo nulio gamybos programai. Naudokite gerai patikrintas, audituotas ir recenzuotas bibliotekas, tokias kaip `noble-curves`. Šios bibliotekos yra specialiai sukurtos ekspertų ir atsižvelgia į daugybę subtilių, bet kritinių saugos klausimų.
2. Pastovaus laiko operacijos ir šalutinio kanalo atakos
Viena pavojingiausių spąstų yra šalutinio kanalo ataka. Atakuotojas gali analizuoti nefunkcinius sistemos aspektus – tokius kaip energijos suvartojimas ar tikslus operacijos atlikimo laikas – kad nutekintų informaciją apie slaptus raktus. Pavyzdžiui, jei daugyba su '1' bitu rakte trunka šiek tiek ilgiau nei su '0' bitu, atakuotojas gali atkurti raktą stebėdamas laiko svyravimus.
Standartinės BigInt operacijos „JavaScript“ nėra pastovaus laiko. Jų vykdymo laikas gali priklausyti nuo operandų reikšmės. Profesionaliose kriptografinėse bibliotekose naudojami labai specializuoti algoritmai, siekiant užtikrinti, kad visos operacijos su privačiaisiais raktais užtruktų pastovų laiką, nepriklausomai nuo rakto reikšmės, taip sumažinant šią grėsmę.
3. Saugus atsitiktinių skaičių generavimas
Bet kurios kriptografinės sistemos saugumas prasideda nuo jos atsitiktinumo kokybės. Privatieji raktai turi būti generuojami naudojant kriptografiškai saugų pseudo-atsitiktinių skaičių generatorių (CSPRNG). „JavaScript“ aplinkose visada naudokite integruotas API:
- Naršyklė:
crypto.getRandomValues() - Node.js:
crypto.randomBytes()
Niekada nenaudokite `Math.random()` kriptografiniams tikslams, nes jis nėra skirtas būti nenuspėjamas.
4. Domeno parametrų ir viešųjų raktų patvirtinimas
Gavus viešąjį raktą iš išorinio šaltinio, būtina jį patvirtinti. Atakuotojas gali pateikti kenkėjišką tašką, kuris iš tikrųjų nepriklauso nurodytai elipsinei kreivei, o tai gali sukelti atakas, kurios atskleidžia jūsų privatųjį raktą ECDH raktų apsikeitimo metu (pvz., Netinkamos kreivės atakos). Patikimos bibliotekos automatiškai atlieka šį patvirtinimą.
Išvada
BigInt atsiradimas iš esmės pakeitė kriptografijos kraštovaizdį „JavaScript“ ekosistemoje. Jis perkėlė ECC iš nepermatomų, juodųjų dėžių bibliotekų srities į tai, kas gali būti diegiama ir suprantama natyviai, skatinant naują skaidrumo ir galimybių lygį.
Mes ištyrėme, kaip ši viena funkcija leidžia atlikti pažangias ir galingas kriptografines operacijas, kurios yra šiuolaikinių saugių sistemų pagrindas:
- ECDH raktų apsikeitimas: Saugaus komunikacijos kanalų nustatymo pagrindas.
- Viešojo rakto atkūrimas: Efektyvumą didinanti technika, svarbi mastelio sistemoms, tokioms kaip „blockchain“.
- Šnoro parašai: Kitos kartos parašų schema, siūlanti pranašesnį efektyvumą, privatumą ir mastelį per agregavimą.
Kaip kūrėjai ir architektai, šių pažangių koncepcijų supratimas nebėra tik akademinis pratimas. Šiandien jie diegiami pasaulinėse sistemose, nuo „Bitcoin“ „Taproot“ atnaujinimo iki saugaus pranešimų siuntimo protokolų, kurie apsaugo mūsų kasdienes pokalbius. Nors galutinis diegimas visada turėtų būti paliktas audituotoms, ekspertų peržiūrėtoms bibliotekoms, gilus mechanizmų supratimas, leidžiamas tokių įrankių kaip BigInt, suteikia mums galimybę kurti saugesnes, efektyvesnes ir novatoriškesnes programas pasaulinei auditorijai.